package sessionbeans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import supportClass.IstanzaDTO;
import supportClass.ViaggioDTO;
import traveldreamEJB.Istanza;
import traveldreamEJB.Pagamento;
import traveldreamEJB.Utente;
import traveldreamEJB.Viaggio;

/**
 * Session Bean implementation class PagamentoSB
 */
@Stateless
@LocalBean
public class PagamentoSB implements PagamentoSBLocal {

	@PersistenceContext
    private EntityManager em;
	
    /**
     * Default constructor. 
     */
    public PagamentoSB() {
        // TODO Auto-generated constructor stub
    }

	@Override
	@RolesAllowed("USERS")
	public void addPagamento(List<IstanzaDTO> daPagare, String remoteUser,
			int idViaggio) {
		
		List<Istanza> istanze=new ArrayList<Istanza>();
		int totale = 0;
		
		Integer max;
		Query massimo  = em.createNamedQuery("Pagamento.findMax");
		max= (Integer) massimo.getSingleResult();
		
		//Calcolo idPagamento
		if(max != null)	max++;
		else	max = 0;	
				
		//Cerco utente che ha effettuato pagamento
		Query utenteByEmail = em.createNamedQuery("Utente.findUtenteByEmail");
		utenteByEmail.setParameter("email",remoteUser);
		Utente utente = (Utente) utenteByEmail.getSingleResult();
		
		//Cerco viaggio a cui fa riferimento pagamento
		Query viaggioById = em.createNamedQuery("Viaggio.findViaggioById");
		viaggioById.setParameter("idViaggio",idViaggio);
		Viaggio viaggio = (Viaggio) viaggioById.getSingleResult();
		
		//Cerco le istanze a cui fa riferimento pagamento e aggiorno il totale
		for(IstanzaDTO tmp:daPagare){
			Query istanzaByID = em.createNamedQuery("Istanza.findIstanzaByID");
			istanzaByID.setParameter("idIstanza",tmp.getIdIstanza());
			istanze.add((Istanza) istanzaByID.getSingleResult());
			
			if(tmp.getElemento().getTipo().equals("Hotel")){
				totale+=tmp.getPrezzo();
			}else{
				totale+=tmp.getPrezzo()*viaggio.getNumeroPersone();
			}
		}
		
		//Inserisco pagamento in database
		Pagamento newPagamento = new Pagamento(max, totale, istanze, utente, viaggio);
		em.persist(newPagamento);
		
	}

}
